package com.gec.shiro;

import com.gec.dao.MenuMapper;
import com.gec.domain.Permission;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 名称：FilterDataSource类 （第一版）
 *过滤器数据源（工厂bean）
 * 用它来产生过滤器链配置数据
 * */
public class FilterDataSource{
    @Autowired
    private MenuMapper menuMapper;
    //模拟一个数据库表

    //{2}相关属性
    /**这是过滤器的定义*/
    private Map<String, String> definitions = new LinkedHashMap<>();
    private  String regex ="\\s*([^\\s]+)\\s*=\\s*([^\\s]+)\\s*";
    //{3}去除空白字符用的
    private String[] trimSpace(String line,String regex){
        //{1}根据正则表达式生成一个编译器
        Pattern compile = Pattern.compile(regex);
        //{2}得到一个匹配器
        Matcher mat = compile.matcher(line);
        if(!mat.matches()){
            throw new RuntimeException("配置格式错误");
        }
        return  new String[]{mat.group(1),mat.group(2)};
    }
    //{4}设置匿名就可以访问的资源
    /*
     * 目的为了解析xml中的以下内容：
     * /User/showLogin = anon
     * /User/login = anon
     * */
    public void setAnonymousFilter(String definition){
        String[] lines = definition.split("\n");
        // L的数据：/User/showLogin = anon等   xml里配置的无需权限可访问的资源
        for (String L:lines) {
            L = L.trim();//trim的作用：去除前后的空格
            if(L.length()==0) {
                continue;
            }
            //{1}裁掉里面多余的空白字符
            String[] data = trimSpace(L, regex);
            System.out.println(data[0]+"="+data[1]);
            //{2}设置到map中
            definitions.put(data[0],data[1]);
        }
    }
    //{5}提供给外部获取过滤器链的Map
    //definitions    定义
    public Map getFilterDefinitions(){
        //{1}调取数据库中的数据  [获取系统菜单权限]
        System.out.println("----------------OA系统权限-------------------");
        //sysPermss中的数据：【menuID，映射地址，权限】
        Set<Permission> sysPerms = menuMapper.getSysPermission();
        //{2}数据库中的数据格式：user:save
        for (Permission p:sysPerms){
            //perms可以用来设置多个权限   [ps]/User/list = perms["user:add,user:list"]  增加多个参数需要加“”
            StringBuffer sb = new StringBuffer("perms[");
            sb.append(p.getPermission());
            sb.append("]");
            definitions.put(p.getMapping(), sb.toString());
            System.out.println("{permission} "+ p.getMapping()+"="+sb.toString());
            System.out.println("----------------OA系统权限-------------------");
        }
//        anon：无需认证即可访问。
//        authc：需要认证才可访问。
        definitions.put("/**","authc");
        return definitions;//[数据OK]
    }



    public static void main(String[] args) {
        String text = "    \n"+
                "    /User/showLogin = anon  \n"+
                "    /User/login = anon      \n"+
                "    \n";
        FilterDataSource ds = new FilterDataSource();
        ds.setAnonymousFilter(text);
        Map map = ds.getFilterDefinitions();
        Set keySet = map.keySet();
        System.out.println("---------------------------");
        for (Object key:keySet) {
            Object val = map.get(key);
            System.out.println(key+":"+val);
        }
        System.out.println("---------------------------");
    }
}